跳到主要内容

NodeJS 整合 SQLite

整合到 NodeJS

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(':memory:');

db.serialize(function() {
db.run("CREATE TABLE lorem (info TEXT)");

var stmt = db.prepare("INSERT INTO lorem VALUES (?)");
for (var i = 0; i < 10; i++) {
stmt.run("Ipsum " + i);
}
stmt.finalize();

db.each("SELECT rowid AS id, info FROM lorem", function(err, row) {
console.log(row.id + ": " + row.info);
});
});

db.close();

配置环境

npm install sqlite3 -S

这个过程出现两个的库 node-pre-gypnode-gyp 这是在下载源码并编译,需要要挂上小飞机,否则会卡在编译这里(编译的确实有点慢)

node-pre-gyp install --fallback-to-build

node-gyp:是一个跨平台的命令行工具,用于编译 C++ 编写的 nodejs 扩展,首先 gyp 是为 Chromium 项目创建的项目生成工具,可以从平台无关的配置生成平台相关的 Visual Studio、Xcode、Makefile 的项目文件,node-gyp 就是将其集成到 nodejs 中。

因为 linux 的二进制分发快平台做的并不好,所有 npm 为了方便干脆就直接源码分发,用户装的时候再现场编译。不过对有些项目二进制分发就比源码分发简单多了,所以还有个 node-pre-gyp 来直接二进制扩展的分发。

两者区别在于 node-gyp 是发布扩展的源码,然后安装时候编译;node-pre-gyp 是直接发布编译后的二级制形式的扩展。

新建并打开数据库

new sqlite3.Database(filename, [mode], [callback])

filename:有效值是一个文件名,如:mydatebase.db,数据库打开之后会创建一个 mydatebase.db 的文件用于保存数据。如果文件名是 :memory:,表示是一个内存数据库(类似h2那种),数据不会持久化保存,当关闭数据库时,内容将丢失。

mode(可选):数据库的模式,共3种值:sqlite3.OPEN_READONLY(只读),sqlite3.OPEN_READWRITE(可读写)和 sqlite3.OPEN_CREATE(可以创建)。 默认值为 OPEN_READWRITE |OPEN_CREATE

callback(可选):则当数据库成功打开或发生错误时,将调用此函数。 第一个参数是一个错误对象,当它为空时,表示打开成功。

var database;

// 创建一个数据库的名字是 "datebase.db" 如果有的话则不会创建
database = new sqlite3.Database("datebase.db");

// 也可以使用内存型,数据不会永久保存
database = new sqlite3.Database(":memory:");

// 关闭数据库连接
database.close();

查询数据

const sqlite3 = require("sqlite3").verbose()
// sqlite 数据库地址
let sqliteDbPath = "./studysqlite.db"
// 打开 sqlite 数据库
let db = new sqlite3.Database(sqliteDbPath)

// all 查询所有数据
db.all(`select * from tb_user`, function(err, row) {
if (err) throw err
else {
console.log('all查询结果', row) // 返回的是一个数组
// console.log(JSON.stringify(row));
}
})

// each 逐条查询数据
db.each("select * from tb_user", function(err, row) {
if (err) throw err
else {
console.log('each查询结果:', row)
}
})

// 按条件查询
db.each("select * from tb_user where user_name = ?", '张三', function(err, row) {
if (err) throw err
else {
console.log('each筛选结果:', row)
}
})

直接操作 SQL

// Directly in the function arguments.
db.run("UPDATE tbl SET name = ? WHERE id = ?", "bar", 2);

// As an array.
db.run("UPDATE tbl SET name = ? WHERE id = ?", [ "bar", 2 ]);

// As an object with named parameters.
db.run("UPDATE tbl SET name = $name WHERE id = $id", {
$id: 2,
$name: "bar"
});


db.run("UPDATE tbl SET name = ?5 WHERE id = ?", {
1: 2,
5: "bar"
});

Database#run(sql, [param, ...], [callback]) 注意这个回调会在语句的准备和执行中发生错误的时候被掉用

新增数据

// 增加一条数据
var sql_add = db.prepare(`insert into tb_user (user_name, birthday) values('buding', 123456)`)
sql_add.run()
console.log(sql_add)

删除一条数据

// 删除数据
var sql_del = db.prepare(`delete from tb_user where user_name='buding'`)
sql_del.run()

数据修改

// 修改一条数据
var sql_modify = db.prepare(`update tb_user set user_name='buding' where user_id=1`)
sql_modify.run()

关闭数据库

注意:用完数据库要记得释放 Database#close([callback])

// 关闭数据库连接
database.close();

Reference

参考资料 官方库 Node-SQLite 参考资料 官方文档